// Package repository 实现数据访问层
// 该包提供对用户实体的数据库操作功能
package repository

import (
	"aigen-todo/internal/interfaces"
	"aigen-todo/internal/models"
	"gorm.io/gorm"
)

// UserRepository 用户仓库结构体
// 实现了用户数据的增删改查操作
type UserRepository struct {
	// db gorm数据库实例
	db *gorm.DB
}

// 确保 UserRepository 实现了 interfaces.UserRepositoryInterface 接口
var _ interfaces.UserRepositoryInterface = &UserRepository{}

// NewUserRepository 创建新的用户仓库实例
// 参数:
//
//	db - gorm数据库实例
//
// 返回值:
//
//	*UserRepository - 用户仓库实例
func NewUserRepository(db *gorm.DB) *UserRepository {
	return &UserRepository{db: db}
}

// Create 创建新用户
// 参数:
//
//	user - 用户模型指针
//
// 返回值:
//
//	error - 创建错误信息
func (r *UserRepository) Create(user *models.User) error {
	return r.db.Create(user).Error
}

// GetByID 根据ID获取用户
// 参数:
//
//	id - 用户ID
//
// 返回值:
//
//	*models.User - 用户模型指针
//	error - 查询错误信息
func (r *UserRepository) GetByID(id uint64) (*models.User, error) {
	var user models.User
	err := r.db.First(&user, id).Error
	return &user, err
}

// GetByUsername 根据用户名获取用户
// 参数:
//
//	username - 用户名
//
// 返回值:
//
//	*models.User - 用户模型指针
//	error - 查询错误信息
func (r *UserRepository) GetByUsername(username string) (*models.User, error) {
	var user models.User
	err := r.db.Where("username = ?", username).First(&user).Error
	return &user, err
}

// GetByEmail 根据邮箱获取用户
// 参数:
//
//	email - 邮箱地址
//
// 返回值:
//
//	*models.User - 用户模型指针
//	error - 查询错误信息
func (r *UserRepository) GetByEmail(email string) (*models.User, error) {
	var user models.User
	err := r.db.Where("email = ?", email).First(&user).Error
	return &user, err
}

// Update 更新用户信息
// 参数:
//
//	user - 用户模型指针
//
// 返回值:
//
//	error - 更新错误信息
func (r *UserRepository) Update(user *models.User) error {
	return r.db.Save(user).Error
}

// Delete 删除用户（硬删除）
// 参数:
//
//	id - 用户ID
//
// 返回值:
//
//	error - 删除错误信息
func (r *UserRepository) Delete(id uint64) error {
	return r.db.Unscoped().Delete(&models.User{}, id).Error
}
